<?php
/**
 * Класс аутентификации пользователей.
 * В системе есть 5 уровней пользователей:
 * Admin, publisher_agent, publisher, advertiser, guest
 * 
 */
class Application_Plugin_Acl extends Zend_Controller_Plugin_Abstract 
{
    public function __construct()
    {        
        $this->acl = new Zend_Acl();
        // добавляем различные типы пользователей
        $this->acl->addRole(new Zend_Acl_Role('guest'));
        $this->acl->addRole(new Zend_Acl_Role('advertiser'));
        $this->acl->addRole(new Zend_Acl_Role('publisher'));        
        $this->acl->addRole(new Zend_Acl_Role('publisher_agent'), 'publisher');
        $this->acl->addRole(new Zend_Acl_Role('admin')); 

        // добавляем ресурсы, доступом к которым нужно управлять        
        $this->acl->add(new Zend_Acl_Resource('default:index'));                  
        $this->acl->add(new Zend_Acl_Resource('default:registration'));
        $this->acl->add(new Zend_Acl_Resource('default:authorization'));
        $this->acl->add(new Zend_Acl_Resource('default:ajax'));
        $this->acl->add(new Zend_Acl_Resource('default:adver'));
        // управление аккаунтами            
        $this->acl->add(new Zend_Acl_Resource('adv:index'));
        $this->acl->add(new Zend_Acl_Resource('adv:advertiser'));
        $this->acl->add(new Zend_Acl_Resource('adv:campaigns'));
        $this->acl->add(new Zend_Acl_Resource('adv:statistic'));
        
        $this->acl->add(new Zend_Acl_Resource('pub:index'));
        $this->acl->add(new Zend_Acl_Resource('pub:publisher'));
        
        
        // админу разрешаем доступ везде                  
        $this->acl->allow('admin', null);                      
        // добавляем исключения для "гостей", чтобы они могли войти или зарегистрироваться
        $this->acl->allow('guest', 'default:index');
        $this->acl->allow('guest', 'default:registration');
        $this->acl->allow('guest', 'default:authorization');
        $this->acl->allow('guest', 'default:adver');
        $this->acl->allow('guest', 'default:ajax');
        //$this->acl->allow('guest', 'default:authorization', array('index'));
        $this->acl->allow('advertiser', 'default:authorization', array('logout'));
        $this->acl->allow('publisher', 'default:authorization', array('logout'));
        $this->acl->allow('publisher', 'default:ajax');
        $this->acl->allow('advertiser', 'default:adver');
        // разрешаем пользоватлеям уровня 'advertiser' & 'publisher' доступ к управлению своими аккаунтами
        $this->acl->allow('advertiser', 'adv:advertiser');
        $this->acl->allow('advertiser', 'adv:campaigns');
        $this->acl->allow('advertiser', 'adv:statistic');
        $this->acl->allow('advertiser', 'default:ajax');
        $this->acl->allow('advertiser', 'default:adver');
        $this->acl->allow('publisher', 'pub:publisher');        
        Zend_Registry::set('acl', $this->acl);
    }
    
    /**
     * Проверяем привилегии пользователя.
     * Если их нету - устанавливаем роль по умолчанию 'Guest'     
     */
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $auth = Zend_Auth::getInstance();        
        $acl = Zend_Registry::get('acl');        
        // проверяем если юзер вошел в систему и имеет правильный тип,
        // иначе, назначаем ему тип по умолчанию ("guest")
        if ($auth->hasIdentity())
            $role = $auth->getIdentity()->role;
        else
            $role = 'guest';

        if (!$acl->hasRole($role))
            $role = 'guest';

        // ACL resource - запрошенный модуль:контроллер
        $resource = $request->module. ':'. $request->controller;

        // ACL privilege  - запрошенное действие
        $privilege = $request->action;

        // если не имеем конкретно добавленного ресурса, проверяем
        // привилегии по умолчанию
        if (!$acl->has($resource))
            $resource = null;

        // доступ запрещен - перенаправляем запрос на страницу входа
        if (!$acl->isAllowed($role, $resource, $privilege)) {             
            $request->setModuleName('');
            $request->setControllerName('index');
            $request->setActionName('index');
        }
    }    
}

?>
